#!/usr/bin/env bash
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Wrapper for thrift that attempts to use the system thrift if it's of the expected version,
# otherwise it bootstraps a new one.
set -e -u

if [[ $# -lt 1 ]]; then
  cat <<EOF
Usage: thriftw EXPECTED_THRIFT_VERSION THRIFT_ARGS...

Run the thrift compiler at EXPECTED_THRIFT_VERSION with THRIFT_ARGS, bootstrapping if necessary.
EOF
fi
expected_version=$1
shift

HERE=$(cd `dirname "${BASH_SOURCE[0]}"` && pwd)

function check_thrift_version() {
  local readonly thrift="$1"

  [[ $("${thrift}" --version) = "Thrift version ${expected_version}" ]]
}

function check_thrift_gen_lang() {
  local readonly thrift="$1"
  local readonly gen_identifier="$2"

  "${thrift}" -help 2>&1 | grep -q "${gen_identifier}:"
}

function compatible_thrift() {
  local readonly thrift="$1"

  [[ -x "${thrift}" ]] && \
  check_thrift_version "${thrift}" && \
  check_thrift_gen_lang "${thrift}" "java (Java)" && \
  check_thrift_gen_lang "${thrift}" "js (Javascript)" && \
  check_thrift_gen_lang "${thrift}" "html (HTML)" && \
  check_thrift_gen_lang "${thrift}" "py (Python)"
}

function compatible_system_thrift() {
  which -a thrift | while read thrift; do
    if compatible_thrift "${thrift}"; then
       echo "${thrift}"
       return
    fi
  done
}

thrift="$(compatible_system_thrift)"
if [[ -z "${thrift}" ]]; then
  thrift="${HERE}/thrift-${expected_version}/compiler/cpp/thrift"
  if ! compatible_thrift "${thrift}"; then
    make -C "${HERE}" clean
    make -C "${HERE}"
    if ! compatible_thrift "${thrift}"; then
      echo "Failed to find or build a thrift binary compatible with Aurora requirements!"
      exit 1
    fi
  fi
fi

if [[ "$@" == "--which" ]]; then
  echo "${thrift}"
else
  exec "${thrift}" "$@"
fi
